package _4lists.src.SinglyLinkedList;

import java.util.function.Consumer;
/*注意一下：
* p != null: 确保当前节点不是空节点，适用于遍历整个链表或处理每个节点。
p.next != null: 确保当前节点的下一个节点不是空节点，适用于遍历链表但不处理最后一个节点的情况*/
public class SinglyLinkedList_new {

    private listNode head=null;//相当于头指针

    /**
     * 用处：向链表的头部添加节点
     * @param value：添加的值
     */
    public void addFirst(int value) {
        //需要考虑2种情况
        //1.链表为空
        //将创建的节点对象直接复制给头节点
        //head = new Node(value, null);
        //2.链表不为空
        head = new listNode(value, head);
        //上面两个head可以直接写成第二种形式

    }

    /**
     * 用处：遍历链表
     */
    public void loop() {
        listNode p=head;
        while (p != null) {
            System.out.println(p.value);
            p = p.next;
        }
    }

    /**
     * 用处：自定义遍历链表
     * @param consumer：接受函数，只接受，并不输出，关键方法：accept
     */
    public void loop(Consumer<Integer> consumer) {
        listNode p=head;
        while (p != null) {
            consumer.accept(p.value);
            p = p.next;
        }
    }

    /**
     *用处： 向尾部添加元素
     * value:要添加的值
     */
    public void addLast(int value) {
        //首先找出最后一个节点
        //当链表为空
        if (head == null) {//相当于向头部进行添加
            addFirst(value);
        }
        //链表不为空
        listNode p = head;
        while (p.next != null) {
            p=p.next;
        }
        //此时的p就是最后一个节点
        p.next=new listNode(value, null);
    }

    /**
     * 用处：获取对应位置的值（链表无索引，只是单纯表示），找到返回对应值，没找到返回-1
     * @param index：要查找的位置
     */
    public int get(int index) {
        //链表中无索引是因为有索引维护成本高，可以用索引表示，例如下面表示，这里由于方法设置原因，无法直接运行，但是可以进行Test
       /* Node p;
        int suoyin=0;
        for (p = head; p!= null; p = p.next, suoyin++) {
            System.out.println(suoyin);
        }*/
        listNode p;
        int i=0;
        for (p = head; p != null; p = p.next, i++) {
            if (i == index) {
                return p.value;
            }
        }
        return -1;
    }

    /**
     * 向指定位置插入元素
     * @param index：对应索引位置
     * @param value：插入的值
     */
    public void insert(int index, int value) {
        listNode p;
        if (index == 0) {
            addFirst(value);
        }else {
            p=head;
            for (int i = 0; i < index-1; i++) {
                p = p.next;
            }
            p.next=new listNode(value,p.next);
        }
    }

    /**
     * 用处：删去第一个节点
     */
    public void removeFirst() {
        if (head == null) {
            return;
        }
        head = head.next;
    }

    /**
     * 用处:删除指定位置的节点
     *
     * @param index：指定位置
     */
    public void remove(int index) {
        if (index == 0) {
            removeFirst();
        }
        listNode p=head;
        for (int i = 0; i < index-1; i++) {
            p = p.next;
        }
        listNode remove = p.next;
        p.next=remove.next;
    }

    public static void main(String[] args) {
        SinglyLinkedList_new s = new SinglyLinkedList_new();
        s.addFirst(1);
        s.addFirst(2);
        s.addFirst(3);
        s.remove(2);
        s.loop(System.out::println);
    }
}
